#ifndef JOHNSON_H
#define JOHNSON_H

#include "Weighted_Directed_Graph.hpp"
#include <set>
#include <queue>

class Johnson
{
private:
    void Initialize_Single_Source(Weight_Directed_Graph *G, int s);
    void Relax(vertex* u, vertex* v, vector<vector<int>>* w);

public:
    bool run_Bellman_Ford(Weight_Directed_Graph *G, int s, vector<vector<int>>* w);
    void output_BellmanFord_result(Weight_Directed_Graph *G, int s);
    void run_Dijkstra(Weight_Directed_Graph *G, int s, vector<vector<int>>* w);
    vector<vector<vector<int>>> run_Johnson(Weight_Directed_Graph *G, vector<vector<int>>* w);
    void output_Johnson_result(vector<vector<vector<int>>>* D_PI);
};


#endif